!% $Small Constant Story "Swineback Ridge"; Constant Headline "^A Desperate Battle^ Copyright (C) 2006 by Eric Eve^"; Constant DEATH_MENTION_UNDO; Constant MAX_SCORE 15; Constant ENEMY "You can't fight the enemy single-handed, you have no intention of deserting to them, and you've heard horrendous stories about what they do to prisoners. "; Release 1; Attribute view; Attribute flammable; Replace MakeMatch; Replace Identical; Replace NounDomain; Replace TryGivenObject; #Ifdef DEBUG; Replace LanguageVerbIsDebugging; #Endif; Include "Parser"; Include "seeno.h"; Include "style.h"; Include "smartcantgo.h"; Include "Tasks"; Object LibraryMessages with before [; Attack: if(noun==player) "Self-mutilation is no part of a soldier's duty."; Burn: if(noun==player) "You aren't ready to immolate yourself just yet."; print_ret (CTheIs) noun, "n't readily flammable."; Insert: ! if(lm_n == 1 && noun == black_powder && second==canvas_bag && second has open) ! { ! move noun to second; ! give noun moved; ! give noun ~concealed; ! print_ret "You manage to scoop up all the black powder into ", (the) second, "."; ! } if(lm_n == 1) { print "(first taking ", (the) lm_o, ")^"; keep_silent = true; ; keep_silent = false; if(noun in player) <>; rtrue; } LookUnder: "There's no need to look under anything in this game; EXAMINE and SEARCH should suffice."; PutOn: if(lm_n == 1) { print "(first taking ", (the) lm_o, ")^"; keep_silent = true; ; keep_silent = false; if(noun in player) <>; rtrue; } Go: if(lm_n == 5 && lm_o has openable) { if(lm_o has locked) print "(first trying to open "; else print "(first opening "; print (the) lm_o,")^"; keep_silent = true; ; keep_silent = false; if(lm_o has open) <>; rtrue; } Miscellany: if(lm_n == 44) "There is nothing suitable here for ~all~ to refer to."; Open: if(lm_n == 2) { print (The) lm_o; if(lm_o has pluralname) print " seem"; else print " seems"; " to be locked. "; } Pray: "It'll take more than prayer to defeat the Phartipu. "; Push: if(lm_n==3) "That won't achieve anything."; PushDir: if(lm_n==1) "That would be futile."; Remove: if(lm_n==2 && noun==dagger && second==corpse && dagger hasnt moved) <>; Search: if(lm_n==5 && noun has openable && noun hasnt open) { print "(first "; if(noun has locked) print "trying to open "; else print "opening "; print (the) noun, ")^"; <>; } Sing: "Everyone tells you your singing makes a frightful noise, but it probably isn't quite frightful enough to demoralize the enemy. "; Sleep: "You'd love to, but first you have a battle to win."; Sorry: "You will be if the Phartipu get over the ridge!"; Think: "No time for that - the King sent you here because you're a man of action."; WaveHands: if(location has view) "You don't have any friends in the enemy camp, nor do you want to signal the Phartipu. Besides, they probably wouldn't see you waving."; ] ; Include "pname.h"; Include "Verblib"; Include "NewMenus"; !==================================================== class Room with description "Under Construction", name 'landscape' 'land' 'view', cant_go [; SmartCantGo(); ], has light ; class Distant with before [; examine: rfalse; default: print_ret (CTheIs) self, " too far away. "; ], before_implicit [; Take: return 2; ], has scenery ; class Fixture has scenery ; class Path with path_dir 0, before [dir; Follow, Enter, GoAlong: dir = PrintValOrRun(self, path_dir); if(dir > 1) <>; if(dir==0) "You can't go that way. "; Take: if(verb_word=='take') <>; ] has scenery ; class Tent with before [; Enter: <>; Burn: print_ret "Seeing your ", (name) self, " in flames would doubtless encourage the Phartipu, but that's hardly your aim!"; Search: <>; Open: "It's already as open as it needs to be."; Close: "It doesn't exactly have a door!"; Lock, Unlock: "The Loraynian army never got round to designing lockable tents."; ] has scenery ; !===================================================== Room dustyPath "Dusty Path" with description "The long dusty path leads through untended fields up towards Swineback Ridge to the north. To the south it leads back into the heartlands of the Kingdom of Lorayne, the land you are determined to defend at all costs against the barbarian hordes of the Phartipu. A narrow lane leads off across the fields to the east. ", scenic 'dry' 'dust' 0 "Dry dust coats the path. " 'untended' 'fields' 'unharvested' 'ripe' 'crops' 0 "The crops look ripe but unharvested - whoever used to farm this land has presumably fled in terror at the prospect of an invasion.", n_to lowerRidge, s_to "You can't turn back now, you have an army to lead and a battle to fight. If you lose on the morrow, the kingdom will be overrun by the barbarians and its people variously tortured, butchered, raped or enslaved according to the customs of the vile Phartipu. ", e_to [; print "You walk for about half a mile down the narrow lane.^"; return outside_hut; ], compass_look [ obj; switch(obj) { s_obj: "To the south the path leads back into the heart of the kingdom, to Enyarol the royal capital, Alorney your home town, and all the other places you're determined to protect from the depredations of the barbarian Phartipu."; e_obj: "A narrow lane runs across the fields to the east. "; n_obj: "The dusty lane continues north to Swineback Ridge. "; d_obj: "You stare down at the dust on the path. "; u_obj: <>; default: "There's nothing that way but fields. "; } ] ; Path -> "dusty path" with name 'long' 'dusty' 'path', before [; Examine: <>; ], path_dir n_obj ; Distant -> "ridge" with name 'swineback' 'ridge', description "It's a ridge of high ground just up ahead to the north, though the name ~Swineback~ strikes you as slightly fanciful, since you see nothing especially porcine about its shape; it might just as well have been called ~Oxback Ridge~ or ~Armadilloback Ridge~ for that matter, expect that Loraynian farmers tend not to keep many herds of armadillo. " ; Distant -> "kingdom" with name 'kingdom' 'of' 'lorayne', before [; Examine: <>; ] ; Path narrow_lane "narrow lane" with name 'narrow' 'lane' 'cart' 'track', description [; if(location == dustyPath) string 00 "eastwards"; else string 00 "westwards"; "The narrow lane, little more than a cart track, runs @00 across the fields. "; ], path_dir [; if(location == dustyPath) return e_obj; return w_obj; ], parse_name [k wd last_wd dir; wd = NextWord(); if(location==dustyPath) dir ='east'; else dir = 'west'; while(wd == 'narrow' or 'lane' or 'cart' or 'track') { k++; last_wd = wd; wd = NextWord(); } if(wd == 'to' or 'from'){ if(last_wd ~= 'lane' or 'track') return 0; last_wd = wd; k++; wd = NextWord(); } if(wd == 'the' or dir && last_wd == 'to' or 'from'){ k++; wd = NextWordStopped(); if(wd == dir) k++; else if(wd ~= -1) return 0; } return k; ], found_in dustyPath outside_hut ; Room lowerRidge "Lower Ridge" with name 'lower' 'slopes' 'of' 'the' 'ridge', description [; if(topOfRidge has visited) "Here the path from the south starts to ascend the ridge where tomorrow the army of Lorayne (right now, that's you) must make its final stand against the barbarian horde of the Phartipu. "; "The path from the south starts to climb the ridge where you expect to find your army encamped. Worryingly, there's no rear-guard here, no baggage-train, no sentinels posted to greet you. More worryingly, you hear no signs of life from up above, no singing, no orders being shouted, no clank of weapons on armour as troops move about. "; ], before [; Listen: "It's quiet - far too quiet. "; Exits: "You can only go south or north (= up)."; ], compass_look [; switch(noun){ n_obj: <>; s_obj: "To the south of the ridge the long dusty path runs south across the great plain, at the northern end of which are a series of untended fields. "; e_obj, w_obj: "There's nothing that way but the lower slopes of the ridge. "; u_obj: <>; } ], s_to dustyPath, u_to [; return self.n_to(); ], n_to topOfRidge, scenic 'great' 'plain' 0 "The plain stretches to the south as far as you can see." 'untended' 'overgrown' 'fields' 0 "To your, admittedly not agriculturally-tutored, eye they look rather overgrown." 0 'far' 'distance' 0 "You can't really see that far. " ; Path -> ridge_path "steep path north" with name 'steep' 'path' 'ridge' 'north' 'n//', description "The path climbs quite steeply up to the top of the ridge. ", before [; Climb: <>; ], path_dir n_obj ; Path -> dusty_path_s "long dusty path south" with name 'long' 'straight' 'dusty' 'path' 'south' 's//', description "The long dusty path runs straight across the plain into the far distance. ", path_dir s_obj ; !======================================================================================= Room outside_hut "Outside a hut" with name 'narrow' 'lane', description "The narrow lane from the west comes to an end outside a solitary hut in the midst of the surrounding fields. ", w_to [; print "You retrace your steps down the narrow lane and shortly arrive back on the main path.^"; return dustyPath; ], in_to hut_door, s_to hut_door, compass_look [; if(noun == w_obj) "A narrow lane heads off to the west through the fields. "; if(noun == u_obj) <>; if(noun == d_obj) "You stare down at the ground."; "There's nothing much that way but fields. "; ], before [; Exits: "You can go west or in (= south). "; ] ; Fixture -> hut "small hut" with pname '.x' 'small' '.x' 'lonely' '.or' 'solitary' '.x' 'storage' 'hut' '.or' 'shed', description "It has a solid wooden door but no windows; it's really little more than a shed, perhaps some kind of storage shed.", before [; Enter: <>; Open: <>; Close: <>; Lock: <>; Unlock: <>; ], has openable lockable ; Fixture -> "surrounding fields" with name 'surrounding' 'untended' 'fields' 'overripe' 'crops' 'weeds' 'field' 'weed', description "You're no kind of farmer, but the crops look overripe, the fields untended. You also suspect that rather too many weeds have been allowed to grow round here, apart from one patch of ground close to the hut.", before [; Enter: "You have far more urgent things to do than wander round the fields."; Search: <>; Examine: rfalse; default: "You can leave agriculture to the peasants."; ] has pluralname ; Fixture -> patch "patch of ground" with pname '.x' 'small' '.x' 'weed-free' 'patch' 'of' 'ground' '.p' 'thin' 'covering' '.or' 'blades' 'of' 'grass', description "Just to the right of the hut door there's a small patch of ground where the weeds have all shrivelled and died, leaving only a thin covering of grass. Amongst the blades of grass you think you see a few grains of black powder, but it may only be dirt. ", before [; Search: <>; Enter: "There's nothing to be achieved by trampling on the patch."; ] ; Object -> powder_grains "grains of powder" with name 'few' 'grains' 'of' 'black' 'powder' 'dirt', description "You can't really make out what it is - it may be nothing - but a search round about turns up nothing quite like these few black grains on any of the surrounding ground apart from this one weed-free patch. ", before [; SetPronoun('it', self); Take, Remove, Insert, Transfer: "It would be far too fiddly to try to collect the few grains of dirt. "; Search: <>; Smell: "There's not enough of them for you to detect a distinct odour. "; Eat, Taste: "The few grains are scarcely enough to taste, but they don't look in the least appetizing."; ], before_implicit [; if(action_to_be==##Eat) return 2; ] has pluralname scenery ; Fixture hut_door "hut door" with pname '.x' 'hut' '.x' 'solid' '.x' 'wooden' 'door' '.p' '.x' 'large' '.x' 'iron' 'lock', description "The solid wooden door is fitted with a large iron lock. ", door_to [; if(location == outside_hut) return inside_hut; return outside_hut; ], door_dir [; if(location == outside_hut) return in_to; return out_to; ], before [; Unlock: if(second==sword) "Your sword is too big and clumsy to force the lock with. "; Lock: if(self hasnt locked) "The lock is broken. "; Attack, Cut: if(self has locked) "Both the door and the lock prove to be remarkably solid."; "You've already broken the lock; there's no need to damage the door as well."; Receive: if(noun== dagger or sword) <>; KnockOn: "You knock on the door but no one answers."; Push: <>; Pull: <>; Take: if(verb_word == 'pick') { "You're an expert soldier, not an expert thief; you can't pick a lock with your fingers!"; } ], after [; Unlock: if(second==dagger) "You insert the blade of the dagger into the lock, and by wiggling it around you manage to force the lock."; Open: achieve(hut_task); ], with_key dagger, found_in outside_hut inside_hut, has door openable lockable locked ; !======================================================================================== Room inside_hut "Inside the hut" with description "It looks like this place is a store for agricultural implements used by whoever was working this land before they fled. ", before [; VagueGo: <>; Exits: "You can only go out (= north)."; ], out_to hut_door, n_to hut_door, has ~light ; Object -> poison_sack "grain sack" with name 'dirty' 'old' 'limp' 'full' 'empty' 'grain' 'sack', description [; if(black_powder hasnt moved) "It looks fairly full, but there's a hole near the bottom where a rat has gnawed it, through which some kind of dark powder is spilling out. "; "It lies limp and empty, a worn sack with a hole in the bottom where a rat has gnawed through it. "; ], initial "A grain sack lies slumped in one corner. ", before [; Take, Remove, Transfer: if(black_powder hasnt moved) "As soon as you try to move the sack, the black powder starts spilling out of the hole at an alarming rate, so you quickly put it down again. "; "You pick up the sack, but decide that it's too worn to be of any use to you, especially as it has a hole near the bottom, so you dump it back in the corner. "; Receive: if(noun == sack_hole) "The hole is already in the sack, in a manner of speaking."; if(black_powder hasnt moved) "The sack is too full. "; ], parse_name [ k g wd; for(::){ wd = NextWord(); if(wd ~= 'worn' or 'limp' or 'full' or 'empty' or 'grain' or 'sack' or 'old' or 'dirty') { if(k>g) return k; return 0; } if(black_powder hasnt moved){ if(wd == 'limp' or 'empty') return 0; } else if(wd == 'full') return 0; k++; if(wd=='grain') g++; } ], add_to_scope sack_hole, has open container ; Object -> black_powder "black powder" with article "some", description "Whatever it is, it isn't any kind of grain fit for human consumption. For one thing, it's black, and you've never eaten black grain. ", parse_name [wd n; for (::) { wd = NextWord(); if((wd == 'black' or 'dark' or 'powder' or 'poison' or 'grain') || ((wd == 'pile' or 'of') && self hasnt moved)) n++; else return n; } ], before [; Take, Remove: if(self hasnt moved || parent(self) ofclass Room) "You pick up a few grains of the stuff but it quickly slips through your fingers again. If you want to take a significant quantity you'll have to find something to carry it in."; print_ret "Unless you're going to pour it somewhere it's best left in ", (the) parent(self), "."; Smell: "It smells pungently repellent."; Taste, Eat: "Better not - look what it did to the rat!"; Pour: if(self hasnt moved) "When you try to pour the powder out of the top of the sack it mostly just pours out through the hole in the bottom."; if(parent(self) ofclass Room) "You can't pour it anywhere until it's in some kind of receptacle."; if(second == pool) { action=##Receive; if (RunRoutines(second, after) ~= 0) { action = ##Pour; rtrue; } action = ##Pour; rtrue; } if(second == waterfall or stream or river or fissure) print_ret "You're not close enough to ", (the) second, " to do that safely; the powder might disperse on the breeze and miss its target. "; if(second==fissure2) "The fissure is above you, and the powder won't pour upwards."; "You don't want to pour it there. "; Insert, Transfer, ThrowAt: if(second == pool or waterfall or stream) <>; if(self in canvas_bag) <>; if(second==canvas_bag or bottle) { if(children(second) > 0) print_ret "It would help if you emptied ", (the) second, " first."; move self to second; give self moved; give self ~concealed; print_ret "You manage to scoop up all the black powder into ", (the) second, "."; } ], before_implicit [; Take: if(action_to_be == ##Eat or ##Insert or ##ThrowAt) return 2; ], dcount 0, daemon [; if(++self.dcount > 2 && location has light) { deadflag = 2; "^You stop to stare out over the enemy camp to see if poisoning their water-supply has had any effect. For hours, nothing seems to happen, as the Phartipu appear to continue their normal nocturnal routine. But shortly after sunrise, it becomes apparent that something has changed. Even from your distant vantage-point you can tell that the mood in the enemy camp is sombre and subdued, for there is none of the excitement and bustle you would expect of an army preparing for a crushing victory.^^ As the sun clears the eastern horizon the Phartipu drums start to beat out a slow, funereal roll. A slow procession approaches the pavilion, and then with great ceremony carries a bier towards a huge funeral pyre. As the pyre is lit, the pall-bearers are ritually executed as a sacrifice to their dead warlord, while his pavilion is simultaneously committed to the flames.^^ For an hour or so you wonder if this funeral is but the prelude to an even more frenzied onslaught than there might otherwise have been; but no, as the smouldering funeral pyre finally dies out, the enemy warriors slowly strike camp and disperse, finally retreating to the north. By noon, the last of them has disappeared out of sight. Perhaps they think that the mysterious death of the Great Pong is a sign that the demon-god Malodor has finally turned against them. But whatever the barbarians think, your homeland is saved."; } ] has concealed ; Object -> rat "dead rat" with name 'dead' 'stiff' 'rat' 'paws', description "It looks quite stiff, but it hasn't started to decompose yet; you judge that it's been dead for several hours. ", initial [; if(black_powder has moved) "A dead rat lies on the ground near the sack. "; "A dead rat lies near the sack, its paws in the pile of powder. "; ], before [; Smell: "Inevitably, you smell a rat."; Eat, Taste: print_ret "The last time you were reduced to eating raw rat was as a desperate young soldier on a survival exercise - and you swore then you'd never suffer it again, raw or cooked. Besides you ", (i) "totally", " draw the line at poisoned rat."; Cut: "You don't have time to start dissecting small mammals right now. Besides, you've never been that curious to examine the innards of a rat."; ] ; Fixture -> "agricultural equipment" with name 'agricultural' 'equipment' 'rakes' 'hoes' 'scythes' 'implement' 'implements' 'tools', description "Rakes, hoes, scythes, peasant stuff like that - nothing to interest you. ", before [; Take, Remove: "You don't have time to start farming!"; Search: <>; ] has pluralname ; Fixture -> "walls" with name 'east' 'west' 'north' 'south' 'wall' 'walls' 'plain' 'wooden' 'hard' 'rough', description "There's nothing special about hut's plain wooden walls. ", before [; SetPronoun('it', self); Touch: "The walls feel hard and rough."; ] has pluralname ; Fixture -> "corners" with name 'corner' 'corners', description "There's nothing particularly interesting in any of the corners of the hut, unless you count the rakes, hoes and scythes dumped there, along with a dirty old sack. ", before [; SetPronoun('it', self); Search: <>; ], has pluralname ; Object sack_hole "hole" with name 'hole', description "It's just a hole, almost certainly gnawed in the sack by the now deceased rat. ", before [; Take, Remove, Transfer: "You can hardly take the hole from the sack. "; Examine, Touch, Smell: rfalse; Receive: if(noun == dagger or rat or small_key or note) print_ret "You poke ", (the) noun, " in the hole, but this doesn't achieve much. "; "The hole isn't that big. "; default: "You can hardly do that with a hole. "; ] has scenery ; !======================================================================================== Room topOfRidge "Top of Swineback Ridge" with name 'top' 'of' 'swineback' 'ridge', description [; if(self has visited) "The top of the ridge (which continues to east and west) affords a depressingly good view over the valley below - depressing because the size of the enemy camp is all too apparent. A path leads back down the ridge to the south, while piles of abandoned equipment lie all around. "; give moon ~absent; give stars ~absent; give sun absent; remove sun; MoveFloatingObjects(); "You reach the top of the ridge, and find it deserted. There is no sign here of the army you were sent to command, just a few pieces of abandoned equipment left lying around. Down to the north, however, the enemy camp is all too apparent - their tents and campfires seem to fill the entire valley.^^ As you reach the top of the ridge, the sun finally sinks beneath the western horizon, the daylight fading with your hopes. But the full moon still provides enough light for you to find your way around reasonably well. "; ], compass_look [ obj; switch(obj){ n_obj: <>; e_obj, w_obj: print_ret "The ridge continues to ", (the) noun, ", though it's hard to make out many details by moonlight. "; s_obj: "A path leads back down to the south. "; u_obj: <>; } ], s_to lowerRidge, w_to west_ridge, e_to east_ridge, n_to ENEMY has view ; Fixture -> "abandoned equipment" with name 'abandoned' 'equipment' 'broken' 'spears' 'discarded' 'armour' 'pieces' 'piles' 'of' 'spear', description "Some broken spears, discarded armour, that sort of thing, eloquently signalling the hasty departure of the army that should have been here.", before [; Take, Search: "You look through the discarded equipment but find nothing worth taking. "; ] ; Path -> ridgePathSouth "path south" with pname 'path' '.x' 'to' '.x' 'the' '.x' 'south' '.or' 's//' '.p' 'hillside', description "The path leads back down the hillside to the southern plain. ", path_dir s_obj ; Object -> ballista "ballista" with name 'large' 'giant' 'robust' 'wooden' 'great' 'ballista' 'artillery' 'crossbow', initial "A giant ballista squats here, pointing out over the valley below. ", description [; if(bolt in self || bottle in self) { if(ballista_handle.is_wound) string 00 "ready to fire"; else string 00 "loaded"; } else string 00 "unloaded"; "Shaped like a giant crossbow, the ballista (which is currently @00) is a powerful artillery piece, with a lever at the back and a handle at the side. "; ], before [; Take, Remove, Turn, Pull, Push, PushDir, Insert, Transfer: "The great ballista is far too heavy for one man to move by himself. "; Receive: if(children(self) > 0) "The ballista can only be loaded with one missile at a time."; if(noun==sword) "A sword would make a very uncertain missile, and you're loathe to part with such a trusty old companion. "; if(noun ~= bolt or bottle) "There's not much point putting that in the ballista. "; if(noun==bottle && children(bottle) < 2) "The bottle won't make much of a missile in its present state."; Fire: <>; Burn, Attack: "You'd better not, it's valuable government property; besides, it's probably the most effective weapon left on the ridge. "; Set: "You don't know enough about ballistics to be able to do that effectively."; Aim: "You don't know enough about ballistics to be able to adjust it effectively, and you suspect it might take more than one person to do it."; Eat: "That would probably give you indigestion."; Taste: "It tastes as wooden as it looks."; Smell: "A faint smell of well-seasoned wood."; Touch: "It feels pretty robust."; ], before_implicit [; if(action_to_be == ##Eat) return 2; ], capacity 1, has open container static ; Fixture -> ballista_lever "lever" with pname '.x' 'plain' '.x' 'wooden' '.x' 'ballista' '.x' 'firing' 'lever', description "It's just a plain wooden lever.", before [missile; missile = child(ballista); Pull, Push: if(ballista_handle.is_wound == false) { self.result = max(self.result, 1); "Nothing much happens, presumably because there is no tension in the spring. "; } if(children(ballista)==0) { ballista_handle.is_wound = false; self.result = max(self.result, 1); "The firing mechanism springs forward, but nothing much else happens, presumably because the ballista isn't loaded. "; } if((missile==bolt && bolt.is_fueled && bolt hasnt light) || (missile==bottle && bottle hasnt light)) "Haven't you forgotten something?"; ballista_handle.is_wound = false; remove missile; self.result = max(self.result, 2); print "You pull the lever and the ballista fires its missile into the valley below. "; if(missile has light) { achieve(fire_task); self.result = max(self.result, 3); string 01 "A number of fires blaze near the river, where tents are burning and Phartipu warriors are running around trying to douse the flames. "; string 02 "But above all you hear the shouts of some men panicking and others trying to give orders from the general region of the blazing tents."; string 03 "bottle"; steep_path.patrolled = false; remove picket; if(missile==bolt) { give bolt ~light; bolt.is_fueled = false; string 03 "bolt"; } "The blazing @03 traces a trajectory towards the river, where it lands among some of the tents near the pavilion. Within moments, there's a satisfying glow as some of the tents catch fire. Shouts of panic follow almost immediately as some Phartipu warriors flee the burning tents and others rush to douse the flames before they spread to the Great Pong's pavilion."; } "You quickly lose sight of it in the dark; presumably it lands somewhere in the enemy camp, and it probably does some damage, but it's obviously going to take more than a few ballista bolts to rout the Phartipu. "; ], result 0 ; Fixture -> ballista_handle "handle" with pname '.x' 'ballista' 'handle' '.or' 'crank', description "It's the sort of handle you could turn. ", before [; Turn, Pull: if(self.is_wound) "The spring is already wound up to full tension. "; self.is_wound = true; "It's hard work, but you manage to crank the ballista handle until the spring reaches full tension."; ], is_wound false ; Fixture -> ballista_spring "spring" with pname '.x' 'ballista' 'spring' '.p' 'bundle' 'of' 'twisted' 'ropes' '.or' 'skeins' '.p' '.x' 'firing' 'mechanism', description "The spring that powers the ballista is basically a bundle of twisted ropes (otherwise known as skeins). ", before [; Pull: if(ballista_handle.is_wound) "It's already at full tension."; "Trying to pull the ropes by hand would be too much like hard work; if you want to prepare the ballista for firing you'd do better to wind the handle. "; Cut: "That would certainly be counterproductive."; Attack: "You have no reason to damage it."; ] ; !======================================================================== Room west_ridge "West End of Ridge" with name 'west' 'end' 'of' 'ridge', description "Although the valley below looks full of enemy tents, up here on the west end of the ridge there's only one, just to the south of where you stand, a large canvas structure that would almost certainly be the command tent were there still an army here to command. The remainder of the ridge slopes away to the west, but the bulk of it lies to the east.", e_to topOfRidge, n_to ENEMY, in_to inside_tent, s_to inside_tent, w_to "The ridge slopes gradually away from the west, but that would take you too far away from where you need to be.", compass_look [; switch(noun){ in_obj: "You can't see inside the tent from here. "; n_obj: <>; e_obj: "The ridge continues to the east, but it's hard to make out many details in the moonlight. "; w_obj: "The ridge slopes gradually away to the west. "; s_obj: "Immediately to the south stands the command tent."; u_obj: <>; } ], before [; Exits: "You can go east or in (= south)."; ] has view ; Tent -> command_tent "command tent" with name 'large' 'canvas' 'structure' 'command' 'tent', description "It's too large to be a sleeping-tent for common soldiers, and it still flies the king's banner. ", ; Fixture -> royal_banner "royal banner" with name 'royal' 'silver' 'blue' 'grey' 'gray' 'king^s' 'banner', description "You know the royal banner to be silver on blue, but in the moonlight it looks like two shades of grey.", before [; Examine: rfalse; default: "The banner, flying from the top of the tent, is out of reach. "; ], ; !=================================================================== Room inside_tent "Inside the Command Tent" with description "It looks surprisingly bare, for a command tent; perhaps the deserting troops looted it before they left. A plain wooden table still stands near the centre, while a metal strong-box lies in one corner. ", name 'inside' 'command' 'tent', out_to west_ridge, n_to west_ridge, before [; Smell: if(noun == nothing) "It smells rather as if someone's been boozing in here. "; VagueGo: <>; Exits: "You can only go out (= north)."; ], has ~light ; Fixture -> "tent" with name 'tent', before [; Examine: <>; Burn: <>; Smell: <>; ] ; Fixture -> table "table" with name 'plain' 'wooden' 'campaign' 'table', description "It's just a plain wooden table, of the sort senior officers often use on campaign.", has supporter ; Object -> -> lamp "small brass lamp" with name 'small' 'military' 'brass' 'lamp' 'lantern' 'burning' 'flame' 'torch', description "It's a tribute to the design of military lamps that this one's flame is still burning, and will no doubt continue to burn for some time to come.", before [; Rub: "No genie appears; you're on your own for this one."; Burn: "The lamp is already lit."; Insert: if(second==pool) "You don't want to do that; the water would probably douse the flame, and you have no way to re-light it."; Douse: "Since you have no way to light it again, that would probably be a bad idea."; ] has light ; Object -> -> note "note" with name 'suicide' 'note' 'paper' , short_name [; if(self has visited) print "suicide "; ], description [; if(self in bottle) { print "It's "; if(bottle has light) print "smouldering and "; "rolled up in the neck of the bottle. "; } give self visited; "On the note is written, in a scratchy hand, ~It started three days ago, terrible rumours flying round the camp, rumours of what the enemy would do to anyone who dared resist them. At first my men left in twos and threes, then in twenties and thirties, till yesterday they started drifting away in companies and regiments, even men I thought were my best officers and comrades-in-arms! And now, only I am left. So what am I to do? I cannot bear the disgrace of reporting this failure to my king, nor do I dare wait to be captured by the vile enemy that has just appeared in the valley below, so that leaves but one course of action left to me - I shall die by my own hand.~"; ], before [; Burn: if(self hasnt visited) "You might at least read it first!"; if(second hasnt light) print_ret "You can't burn anything with ", (the) second,"."; if(self in bottle && bottle notin ballista) "It's a bit premature to set fire to the note just yet - the bottle might blow up in your hand!"; if(self in bottle) { give bottle light; "You set light to the note. "; } if(self in bush) string 0 "the note, and it burns rapidly. A few small flames lick the surrounding foliage, but the fire fails to take hold of the bush. But maybe burning the suicide note will have done"; else string 0 "a corner of the note, and the flame hungrily rushes along the rest of it, consuming it all and reducing it to ash. Perhaps that will do"; remove self; "You set light to @00 something to save Chorza's reputation."; Eat: if(self hasnt visited) "You might want to read it first."; Take: if(self in bottle && bottle has light) "It's alight - you'd burn your fingers."; ], after [; Eat: "Well, it's too late to make Chorza eat his words, so you may as well do it for him. The army paper isn't exactly tasty - in fact it's the most unpleasant thing you've eaten all month, but as you chew and force yourself to swallow the stuff, you console yourself with the thought that you're probably helping to preserve poor old Chorza's reputation. But as you swallow the last disgusting piece, you resolve that next time you want to get rid of a suicide note, you'll simply burn it."; ], has flammable edible ; Object -> corpse "corpse" with name 'body' 'corpse' 'dead' 'soldier' 'man' 'officer' 'general' 'chorza' 'chorza^s' 'belly' 'clothes' 'clothing', description [; print "From his clothing, he's obviously a high-ranking officer. "; if(self hasnt proper) { give self proper; self.short_name = "General Chorza's body"; print "As you stoop over him, you recognize him as General Chorza, your old friend and comrade, who was meant to be commanding the army here until your arrival. "; if(dagger hasnt moved) "A dagger plunged into his belly shows how he died. "; ""; } else print "In fact, it's your old friend and comrade General Chorza.^"; ], initial [; if(self has proper) print "General Chorza's body "; else print "A body, to all appearances a corpse, "; "lies on the ground close to the table. "; ], short_name 0, before [; PronounNotice(self); SetPronoun('it',self); Take, Remove, Push, Pull, Transfer: "It's probably best to leave him where he is for now; it'll be time to arrange an honourable burial when the future of your living countrymen is secured."; Search: if(small_key hasnt moved) { move small_key to player; "A thorough search of the body reveals a small brass key, which you duly take. "; } Smell: "There's a distinct smell of liquor about it, suggesting that the man may not have died entirely sober. Either the liquor disguises the smell of decomposition, or Chorza has not been long dead."; Turn: if(verb_word=='screw') "But necrophilia is so dead boring!"; "You may as well let him lie till you've enough time to arrange a decent burial for him."; Eat: "Chorza was a tough enough old soldier in life; in death he'll be totally indigestible. "; Touch: if(verb_word=='fondle' or 'grope') "At least allow the old soldier some dignity in death!"; "The corpse feels cold. "; Burn: "That's a barbarian Phartipu custom; Chorza deserves a decent Loraynian burial."; ], life [; Kiss: "He's no sleeping beauty, and it's far too late for the kiss of life to save him. "; Attack: "He's already dead. "; Give, Show: "He's too dead to notice. "; WakeOther: "He'll never wake again - not in this life, anyway. "; Ask, Tell, Answer, Order: "He's far too dead to heed you."; ], before_implicit [; Take: return 2; ], has static male animate ; Object -> dagger "dagger" with name 'dagger' 'blade' 'hilt' 'thin' 'long' 'narrow' 'knife', description "It's a fine piece of craftmanship, with a long narrow blade. ", before [; Pull, Transfer: if(self hasnt moved) <>; Eat: StartTimer(self, 2); "That would be even more painfully self-destructive than Chorza's use of it! What do you want, a warning stamped on the hilt saying ~Warning: Eating daggers can seriously damage your health~?"; Rub: if(self.cleaned) "You've already cleaned it once."; if(self hasnt moved) ; self.cleaned = true; "You wipe the blade of the dagger on the ground, removing the worst of the blood and gore."; ], react_before [; No: if(self.time_left) "No - quite, you're a Captain-General in the Army of Lorayne, a position that does require some measure of intelligence, however modest."; Yes: if(self.time_left) "Yes? Even generals have more intelligence than that!"; ], time_left 0, time_out [; ], after [; Take: if(self hasnt moved) { give self ~concealed; print_ret "You gingerly pull ", (the) self, " from the corpse's belly. "; } Remove: if (self hasnt moved && second == corpse) <>; ], cleaned false, has concealed ; Fixture -> strongbox "strongbox" with name 'strong' 'military' 'metal' 'strong-box' 'strongbox' 'box', description "It's a standard military strong-box of the kind commanders use to keep important papers and the like in.", before [; Take, Remove: "It's too heavy and bulky to cart around; you could lift it, but you don't want to be encumbered by it. "; ], after [; Open: achieve(box_task); ], with_key small_key, known_key small_key, has openable container lockable locked ; Object -> -> bottle "bottle" with name 'large' 'empty' 'bottle' 'neck' 'of', description [; if(children(self)==0) "It's empty. "; if(amber_liquid in self) { print "A small amount of some amber liquid remains in the bottom of the bottle. That it ", (i) "is", " only a small amount suggests how your predecessor spent his last few hours. "; if(self has light) string 0 "burning piece"; else string 0 "piece"; if(note in self || intelligence_report in self) "A @00 of paper sticks out through the neck."; new_line;rtrue; } print_ret "The bottle is full of ", (name) child(self), "."; ], short_name [; print "large "; if(children(self)==0) print "empty "; ], parse_name [k ; if(children(self)==0) return -1; while(NextWord() == 'large' or 'bottle' or 'neck' or 'of') k++; return k; ], before [contents is_empty; contents = child(self); is_empty = (children(self)==0); if(self has light && action ~= ##Examine or ##Smell) "You'd better not handle the bottle now you've lit the paper fuse."; Smell: if(is_empty) "Even empty the bottle smells of powerful spirits. "; <>; Empty: if(is_empty) "It's already empty. "; if(contents==amber_liquid) "It would be rather a waste to pour that liquid on the ground."; if(contents==water) { self.implicit_open(); remove contents; "You pour the water onto the ground, where it quickly seeps away."; } EmptyT: if(is_empty) "It's already empty. "; self.implicit_open(); <>; Fill: if(location==inside_cave){ if(parent(black_powder)==nothing) "You've just poisoned that pool, you certainly don't want any water from it for yourself!"; if(is_empty){ self.implicit_open(); move water to self; "You fill the bottle with water from the pool."; } "There's already something in the bottle."; } Receive: if(noun == intelligence_report or note) { if(noun hasnt visited) "You might want to read it first. "; if(contents ~= amber_liquid || children(self) > 1) "There's not much point doing that. "; self.implicit_open(); move noun to self; print_ret "You roll up ", (the) noun, " and insert it in the neck of the bottle, so that one end sticks out and the other dips in the liquid."; } if(noun ~= black_powder or amber_liquid) "The neck of the bottle is too narrow. "; Pour: if(is_empty==false) { self.implicit_open(); <>; } Search: if(contents==amber_liquid) "There's a small amount of amber liquid in the bottom of the bottle."; Take: if(self has light) "You'd better not pick up that bottle - it might explode at any moment!"; Insert: if(second==pool && self has open && self.is_empty) <>; if(second==pool && self has open && contents==black_powder) { move self to pool; remove contents; StartDaemon(contents); "Weighed down by the black powder, the bottle sinks to the bottom of the pool, where it is pushed about by the water bubbling up from the spring. The powder quickly seeps out through the open neck of the bottle, mixing with the water and then being carried out by the current through the fissure."; } Close: if(note in self || intelligence_report in self) "The paper sticking out of the neck prevents you closing the bottle. "; Drink: if(contents ~= nothing){ self.implicit_open(); <>; } "The bottle is empty. "; ], react_before [; Smell: if(noun==nothing) <>; ], implicit_open [; if(self hasnt open){ give self open; print "(first opening the bottle)^"; } ], has transparent container open openable ; Object -> -> -> amber_liquid "amber liquid" with name 'amber' 'liquid' 'alcohol' 'liquor' 'raw' 'spirit' 'hooch' 'drink' 'booze', article "some", before [cont; cont = parent(self); if(cont has light && action ~= ##Examine or ##Smell) "You'd better not handle the bottle right now."; Taste: "It tastes like fire on your tongue. "; Drink: if(self.drunk) "One sip was quite enough. "; self.drunk = true; bottle.implicit_open(); "You take one sip and it almost burns your tongue out. Since tonight of all nights you need to remain sober and clear-headed, you decide to give the rest of it a miss. "; Take: "You can't exactly pick it up. "; Examine, Smell: "One whiff is enough to convince you that this liquor must be powerful stuff. "; Pour, Transfer, PutOn: if(second == bush) "You very much doubt there's enough liquid left in the bottle to cover the bush, and there's always the danger that most of it will run off into the ground. "; if(second ~= bolt) "That would be a terrible waste!"; if(cont ~= nothing && cont hasnt open && cont has openable) { give cont open; print "(first opening ", (the) cont,")^"; } remove self; bolt.is_fueled = true; PronounNotice(bolt_liquid); "Your pour the amber liquid over the tip of the shaft, where it starts to soak into the wood. "; Burn: "That would be rather dangerous - the bottle might explode!"; ], before_implicit [; Take: if(action_to_be == ##PutOn) return 2; return 3; ], drunk false, has scenery ; Object -> -> papers "papers" with name 'papers' 'orders' 'official' 'documents' 'routine' 'reports' 'list', description [; print "They're mostly the standard official documents you'd expect a general to have to deal with: his orders, of course, which in this case tell him to hold Swineback Ridge at all costs; a list of the units under his command (or which were under his command before they all deserted); reports on stores and supplies. "; if(intelligence_report hasnt moved) { move intelligence_report to player; "The only one of any interest is the latest intelligence report, which you take to read separately. "; } "^"; ], before [obj cur ks; Burn: if(second ~= lamp && ~~(second==bolt && second has light)) print_ret "You can't burn anything with ", (the) second,"."; if(intelligence_report hasnt moved) "It might be as well to read them first."; if(self in player && bush in location) "Maybe you don't want to be holding them when you set light to them; you don't want to burn your hands, after all!"; if(self notin bush && bush in location) "It won't do much good burning them there!"; if(self notin bush) "That might be a bit premature. "; if(bottle in bush && amber_liquid in bottle) { print "(first hastily removing the bottle to avoid an explosion)^"; ks=keep_silent; keep_silent=true; ; keep_silent=ks; } bush.burnt = true; remove self; do { obj = nothing; objectloop(cur in bush) { if(cur has flammable) { obj=cur; break; } } if(obj ~= nothing && obj has flammable) remove obj; } until(obj==nothing || obj hasnt flammable); "You apply the flame to the paper, and it quickly catches light. As the fire blazes, it starts to spread to the bush, and after a couple of minutes the bush is burning too. You stand back and watch as the flames take hold, and the smoke drifts out over the valley. After half an hour or so the flames burn out. The bush is still there, but it looks less substantial than before; it has become charred and brittle. You just hope your little bonfire didn't attract too much attention from the enemy camp in the valley below. "; Examine: if(papers notin player) { cur = keep_silent; keep_silent = true; print "(first taking the papers)^"; ; keep_silent = cur; } PutUnder: if(second == bush) <>; ], has pluralname flammable ; Object intelligence_report "latest intelligence report" with name 'latest' 'intelligence' 'report' 'paper', article "the", description [; if(self in bottle) { print "It's "; if(bottle has light) print "smouldering and "; "rolled up in the neck of the bottle. "; } give self visited; "It's a couple of days old, and seems to be from Chorza's scouts, reporting on the inexorable advance of the Phartipu army towards Lorayne's northern border. You are particularly struck by a passage that reads, ~Although the Phartipu are officially worshippers of the demon-god Malodor, their warriors idolize their commander, the Great Pong, perhaps because he has led them to so many victories and never suffered a single defeat. Last night we watched (from a safe distance) as a dozen human prisoners (both male and female) were sacrificed to the Great Pong in an interminable ceremony involving ritual torture too horrible to describe. By the end the Phartipu warriors had worked themselves up into such a frenzy that they seemed to be on the point of acclaiming the Great Pong as Malodor Incarnate.~"; ], before [; burn: if(self hasnt visited) "You might want to read it first."; if(second hasnt light) print_ret "You can hardly set light to anything with ", (the) second, "."; if(self in bottle && bottle notin ballista) "It's a bit premature to set fire to the report just yet - the bottle might blow up in your hand!"; if(self in bottle) { give bottle light; "You set light to the report. "; } if(self in bush) string 0 "set the flame to the intelligence report and it burns well enough. Some of the surrounding foliage starts to smoulder, but the fire is not substantial enough to take hold in the bush, so all you manage to achieve is the destruction of"; else string 0 "put the report in the flame, and watch as the fire consumes it, leaving nothing behind. At that point you wonder what useful purpose was served by burning"; remove self; "You @00 the intelligence report."; eat: "That really isn't the standard military procedure for digesting the contents of a report."; Take: if(self in bottle && bottle has light) "It's alight - you'd burn your fingers."; ] has flammable ; Object small_key "small brass key" with name 'small' 'brass' 'key', description "It's just an ordinary small brass key, nothing fancy, nothing special. You must have seen scores like it in your long career." ; [is_dagger; if(noun==dagger) rtrue; rfalse; ]; [is_corpse; if(noun==corpse) rtrue; rfalse; ]; !========================================================= Room east_ridge "East End of Ridge" with name 'east' 'ridge', description "There's still an excellent view over the valley from here, although the main part of the ridge lies to the west. Further to the east the land slopes down into a wood, but there is a steep path round the wood to the northeast. Several tents have been left abandoned, half-dismantled by fleeing deserters; the only one left standing looks like a supply tent (immediately to the south).", w_to topOfRidge, n_to ENEMY, ne_to [; if(bush in self) "After only a few steps down the path you find your way blocked by a prickly bush. "; return steep_path; ], e_to "It would be easy enough to get lost in that dense wood in broad daylight; at night losing your way would be a virtual certainty, even assuming the wood is penetrable. ", in_to inside_supply_tent, s_to inside_supply_tent, compass_look [; switch(noun){ n_obj: <>; e_obj: "To the east looms a dense, dark wood."; w_obj: "The to west lies the bulk of the ridge, though by the moonlight you can make out little more than vague shapes that way."; ne_obj: "To the northeast you can just make out the start of steep path. "; in_obj: "You can't see inside the supply tent from here."; u_obj: <>; s_obj: "Immediately to the south stands the supply tent."; } ], before [; Exits: "You can go northeast, west or in (= south). "; ] has view ; Fixture -> bush "prickly bush" with name 'thick' 'dry' 'brittle' 'prickly' 'bush' 'foliage' 'twigs' 'twig', description [; print "You can't make out precisely what species of bush it is by moonlight, but it stands about five feet high, and is "; if(self.burnt) print "still a bit too thick to pass through, even though the fire has thinned it out considerably. "; else print "too thick to pass through. "; if(children(self)>0) <>; ""; ], before [; give self visited; Cut: if(second==nothing){ if(sword in player){ print "(with your sword)^"; <>; } if(dagger in player){ print "(with the dagger)"; <>; } print "You can't cut it with your bare hands."; } if(second==dagger) "It would take you all night to prune the bush with that dagger!"; if(second==sword){ if(self.burnt){ while(child(self)) { move child(self) to parent(self); } remove self; achieve(bush_task); move bush_remains to east_ridge; "The badly-burnt bush succumbs to your frenzied attack, and you manage to hack it to pieces with your sword. "; } "Golly Moses! You hack away at the bush with your sword, but you don't make much impression. "; } "You can hardly cut the bush with that!"; Attack: if(second==nothing) "Attacking the bush with your bare hands simply earns you a few scratches. "; if(second==sword or dagger) <>; "That proves singularly futile. "; Burn: if(second ~= lamp && ~~(second==bolt && second has light)) print_ret "You can't burn the bush with ", (the) second, ". "; if(self.burnt) "You've already burned it. "; "The bush starts to smoulder, but doesn't quite catch light, and the few small flames you kindled rapidly go out."; JumpOver: "It's too tall, and you are not as young and fit as you used to be. "; Climb: "There's nothing firm enough on the bush to give you a handhold or foothold. "; Touch: if(self.burnt) "It feels dry and brittle. "; "It feels very dry, as if it hasn't rained here for months. "; Receive: if(noun==bolt) "You can hardly put that in the bush. "; Search: if(children(self)==0) "You won't find anything but twigs and foliage. "; Pull, Push: "The bush wobbles a little, but only a little."; ], react_before [; PutOn: if(second==self) { if(noun==amber_liquid) <>; print_ret "You can't really put things ", (i) "on", " the bush; it's a bit too tall for one thing, and for another the top of the bush doesn't provide much of a supporting surface. "; } ], burnt false, has open container flammable ; Fixture -> wood "wood" with name 'wood' 'thick' 'dense' 'dark' 'belt' 'of' 'trees', description "The thick belt of trees covers the section of ridge that slopes down to the east. ", before [; Enter: <>; ], ; Tent -> supply_tent "supply tent" with name 'large' 'green' 'supply' 'tent', description "It's a large green tent, the standard pattern for supply tents in Lorayne's military.", ; Fixture -> abandoned_tents "abandoned tents" with name 'abandoned' 'half-dismantled' 'half' 'dismantled' 'tents' 'canvas', description "The abandoned tents flop uselessly on the ground in random disarray, an affront to the order and precision of military discipline.", before [; Take, Remove: "You have no use for them."; Enter: "The half-dismantled tents are in no state to be entered."; Burn: "There's no need to encourage the enemy by showing your camp to be in disarray."; Search: "You find nothing of use among the abandoned tents."; Touch: "Just rough, army canvas."; Smell: "You smell nothing unexpected: just the stink of unwashed soldiers, the lingering smell of army cooking, the faint whiff of cheap booze, and all the other odours you've come automatically to associate with soldiers' tents."; ], has pluralname ; Path -> ne_ridge_path "path" with name 'steep' 'path', description "The path leads off to the northeast.", path_dir ne_obj ; Fixture bush_remains "remains of the bush" with name 'remains' 'of' 'bush' 'twigs', description "After your frenzied attack little remains of the bush apart from a few twigs sprouting from the ground. ", before [; SetPronoun('it', self); Cut, Attack, Burn, Take, Remove, Transfer, Pull, Push : "What's left of the bush isn't worth the effort of clearing."; ], has pluralname ; !================================================================================ Room inside_supply_tent "Inside the Supply Tent" with name 'inside' 'the' 'large' 'bare' 'supply' 'tent' 'space', description "There's a large space here, as befits a supply tent, but it's almost entirely bare; it looks as if nearly everything of use has been purloined by deserters. ", before [; VagueGo: <>; Exits: "You can only go out (= north)."; ], out_to east_ridge, n_to east_ridge has ~light ; Fixture -> "tent" with name 'tent', before [; Examine: <>; Burn: <>; Smell: <>; ] ; Object -> canvas_bag "large canvas bag" with name 'large' 'canvas' 'bag', initial "A large canvas bag lies on the ground. ", before [; Receive: if(noun==bolt) "The long shaft is far too big to fit in the bag. "; if(noun==sword) "Your sword is too long to fit in the bag. "; if(noun==lamp) "It's not a not idea to put the lamp in the bag - you might burn it (the bag, that is)."; if(black_powder in self) "The bag is already full."; Fill: if(black_powder notin self && TestScope(black_powder)) <>; if(black_powder in self) "The bag is already full."; if(TestScope(pool)) "It's not that suitable for carrying water. "; EmptyT: if(black_powder in self) <>; Open: "It's open already."; ], has container open ; Object -> bolt_pile "pile of wooden shafts" with pname 'pile' 'of' '.x' 'ballista' 'bolts' '.p' '.x' 'ballista' 'bolt' '.p' 'pile' 'of' '.x' 'wooden' 'shafts' '.p' '.x. wooden' 'shaft', description "Each shaft in the pile has a round cross-section and a pointed tip.", initial "A pile of wooden shafts sits by the entrance. ", before [; SetPronoun('them', self); Take: if(parent(bolt) == nothing) { move bolt to player; PronounNotice(bolt); "You pick up one of the shafts from the pile. "; } else "One shaft at a time is enough, and you've already taken one. "; Search: "You find nothing in the pile of wooden shafts except a whole lot of wooden shafts."; ] has static ; Object bolt "wooden shaft" with pname '.x' 'ballista' 'bolt' '.or' 'missile' '.p' '.x' 'long' '.x' 'round' '.x' 'wooden' 'shaft' '.p' '.x' 'pointed' 'end' '.or' 'tip' '.or' 'point' '.x' 'of' '.x' 'bolt' '.or' 'shaft', description [; print "The long wooden shaft has a round cross-section and a pointed tip"; if(self has light) ", which is burning fiercely."; if(self.is_fueled) ", which is soaked in alcohol."; "."; ], short_name [; if(self has light) print "blazing "; ], is_fueled false, before [; Burn: if(second ~= lamp) print_ret "You can't light anything with ", (the) second, "."; if(self has light) "It's already burning."; if(self.is_fueled == false) "When you apply the lamp to the end of the ballista bolt, the tip starts to smoulder, but it refuses to catch light."; give self light; "The alcohol-soaked bolt-tip quickly catches light and starts burning nicely. "; Eat: StartTimer(self, 2); "(1) You don't like the taste of it, (2) it's too big for you, (3) you might get splinters in your mouth, (4)... need I go on?"; Smell: if(self.is_fueled) "The tip of the shaft smells quite strongly of something alcoholic. "; Take: if(self in player && TestScope(bolt_pile)) <>; Douse: if(self has light) "That might not be so easy to do; besides, you've just gone to all that trouble to get it to burn!"; ], time_left 0, time_out [; ], react_before [; Yes: if(self.time_left > 0) "(4) It's too hard to chew, (5) it would take too long, (6) it's not edible."; No: if(self.time_left >0) "I should think not!"; ], add_to_scope [; if(self.is_fueled) PlaceInScope(bolt_liquid); ] has flammable ; Object bolt_liquid "liquid" with name 'pungent' 'poured' 'amber' 'liquid' 'alcohol' 'liguor', description "The liquid has soaked into the tip of the shaft. ", before [; Smell: if(bolt has light) "You'll burn your nose off if you try that! "; "It still smells powerfully alcohol. "; Burn: <>; Examine: rfalse; default: "You can hardly do that with the amber liquid now that it has soaked into the shaft. "; ], has scenery ; !===================================================================================== Room steep_path "Steep Path" with name 'steep' 'path', description "The steep path down from the top of the ridge to the southwest levels off just above a waterfall cascading down into the valley below. This levelling off is only temporary, though, since the path dips sharply down again as it continues to the northeast.", u_to east_ridge, sw_to east_ridge, ne_to [; if(self.patrolled) { give self locked; move picket to self; "You start down the path, but a few yards from the bottom you become aware that there's an enemy picket patrolling the area; rather than risk being caught you slip silently back up. "; } print "You cautiously descend the path, keeping a close look-out for enemy patrols, but there seem to be none about; perhaps they've all been recalled to fight the fires you started. Anyway, reassured that the coast is clear, you descend to the foot of the path.^"; return foot_of_path; ], d_to [; return self.ne_to(); ], patrolled true, compass_look [; switch(noun){ n_obj: <>; u_obj: <>; d_obj: "Below you, a waterfall pours out of a fissure in the rocks."; sw_obj: "To the southwest you can see the path climb back up to the top of the ridge."; ne_obj: "The path continues to descend the ridge to the northeast."; } ], before [; Exits: "You can go southwest (= up) or northeast (= down). "; ] has view ; Fixture -> sp_hillside "hillside" with name 'rocky' 'hillside' 'rock' 'rocks', description "At this point the rocky hillside climbs sharply up to the north, and falls almost vertically down to the south. ", before [; Climb: "The hillside is too steep to climb, whether up to the north or down to the south."; ] ; Distant -> fissure "fissure" with name 'fissure' 'source', description "So far as you can tell, it might be wide enough to crawl into, but there's no way you can enter it from here, though you might be able to find a way to get to it from below. " ; Distant picket "picket" with pname '.x' 'enemy' 'picket' '.p' 'movement' '.x' 'below', description "You caught sight of an enemy picket as you descended the path, but from up here you can't see at all them clearly; every now and again you think you see some movement below, but it could just be a trick of the moonlight. " ; !------------------------------------------------------------------------- Room foot_of_path "At the Foot of the Path" with name 'foot' 'of' 'path', description "You find yourself at the foot of a steep path that rises sharply to the southwest. To the north the lower part of the ridge slopes down into the valley occupied by the enemy camp, while from the west you hear the sound of running water. ", u_to steep_path, sw_to steep_path, n_to ENEMY, w_to below_fissure, e_to "You wander a short way off to the east, but finding nothing of interest that way, and realizing that it's probably taking you further from your goal, you turn round and come back.", compass_look [; switch(noun){ n_obj: <>; u_obj: <>; e_obj: "You can't see much of interest to the east."; sw_obj: "To the southwest is the path that climbs back up the ridge."; w_obj: "To the west the ground slopes gently up. "; } ], before [; Exits: "You can go west or southwest (= up). "; ] has view ; Path -> path_from_foot "steep path" with name 'steep' 'path', description "The steep path climbs sharply to the southwest. ", before [; Climb: <>; ], path_dir sw_obj ; Fixture water_sound "sound of running water" with name 'sound' 'of' 'running' 'thundering' 'falling' 'water', description [; print "You hear the sound of falling water, a little like heavy rain, "; switch(location) { steep_path: "from below."; foot_of_path: "a short distance off to the west."; below_fissure: "thundering just to the west."; } ], before [; Listen: <>; Examine: rfalse; default: "You can't do that to a sound. "; ], react_before [; Listen: if(noun==nothing) <>; ], found_in foot_of_path below_fissure steep_path ; !======================================================================== Room below_fissure "Ledge Below Fissure" with name 'narrow' 'ledge' 'below' 'the' 'fissure', description "Here a narrow ledge overlooks the valley to the north and a waterfall cascading down directly to the west from a fissure in the rocks some yards above you. The only obvious way you can go from here is back to the east. ", e_to foot_of_path, u_to [; give self locked; if(bolt in round_hole && sword in round_hole) { print "You pull experimentally on the horizontal shaft, and it seems to hold firm, so you hoist yourself onto it with both hands and find yourself sitting astride it. Cautiously, with one hand on the rock face to steady yourself, you manage to stand up on the shaft, and find that you can look into the fissure. After an alarming wobble you get your arms into the fissure, and then manage to hoist your whole body through.^"; return inside_cave; } if(bolt in round_hole && dagger in round_hole){ move dagger to self; "You pull experimentally on the shaft, and it seems to hold firm, but when you try to hoist yourself up on it, the shaft waggles alarmingly and the dagger works loose, dropping to the ground and leaving the shaft too loose to be a safe support for climbing."; } if(bolt in round_hole) "You pull tentatively on the shaft, but it's too loose in the hole; you daren't use it to climb up to the fissure unless you can find a way to make it firmer."; if(sword in round_hole) "You grasp the sword hilt and try to hoist yourself up by it, but the sword wobbles alarmingly, so you quickly give up the attempt."; "You put one hand in the head-height hole in the rock and try to pull yourself up by it, but you don't make much progress. "; ], n_to ENEMY, w_to "That would make you step off the ledge and plummet to your death. ", compass_look [; switch(noun){ n_obj: <>; u_obj: <>; e_obj: "The ledge slopes gently down to the east."; w_obj: "The ledge ends abruptly in a sharp drop to the west. A yard or so beyond its edge a waterfall cascades down into the stream below. "; } ], before [; Jump: "You'll hardly defeat the enemy by jumping to your death. "; ], has view ; Fixture -> round_hole "round hole" with name 'round' 'deep' 'hole', description [; print "It's a few inches in diameter, and looks pretty deep. "; if(children(self) > 0) <>; ""; ], before [obj; Receive: if(children(self) > 1) "There's no room for anything else in the hole. "; if(children(self) > 0){ obj = child(self); if(noun == sword or dagger && obj == bolt){ move noun to self; print_ret "You wedge ", (the) noun, " in the hole next to the shaft. "; } if(noun == bolt && obj == dagger or sword) { move noun to self; print_ret "You insert the shaft in the hole, and wiggle ", (the) obj, " in attempt to wedge it in."; } } Enter: "It's far too small for a person to get into."; ], capacity 2 has container open ; Fixture -> rocks "rocks" with name 'smooth' 'rocks' 'hillside' 'rock', description "The rocks rise almost vertically from here to the fissure, and look too smooth to be easy to climb; but you notice a deep round hole in the rocks at about head-height. ", before [; Climb: <>; ], has pluralname ; Fixture -> fissure2 "fissure" with name 'wide' 'fissure' 'opening' 'entrance', description "It's about ten feet above the ledge and several yards wide; a waterfall cascades out of the western side of the fissure, but the eastern side looks drier, and might be wide enough to crawl through.", before [; Enter: <>; Search: "You can't see into the fissure from here. "; ] ; Distant waterfall "waterfall" with name 'waterfall' 'water', description [; if(location==below_fissure) string 00 "above your head"; else string 00 "below your feet"; "The source of the water seems to be a fissure in the rocks a few yards @00. From there it falls almost vertically down the hillside, splashing on down into a small stream in the valley below. "; ], before [; Listen: <>; ], found_in below_fissure steep_path ; Distant stream "stream" with name 'small' 'stream', description "The stream runs from the foot of the waterfall into the River Hogwash. ", found_in below_fissure steep_path ; !====================================================================== Room inside_cave "Inside a Cave" with name 'inside' 'a//' 'cave', description "This small cave is so cramped you're forced to stoop. The only way out is via the narrow fissure to the north, through which a steady stream of water pours out from the pool at the centre; this pool seems to be fed by a spring. ", out_to [; print "You squeeze through the fissure and clamber back down the rocks.^"; return below_fissure; ], d_to [; return self.out_to(); ], n_to [; return self.out_to(); ], before [; Jump: "There's not enough headroom for that. "; VagueGo: <>; Exits: "You can only go out (= north or down)."; ], compass_look [; switch(noun) { n_obj, out_obj: "Directly to the north lies the mouth of the cave. "; d_obj: "At your feet is the pool occupying the centre of the caves. "; u_obj: <>; default: "There's nothing that way but the wall of the cave."; } ], has ~light ; Fixture -> pool "pool" with name 'pool' 'bubbling' 'submerged' 'spring' 'water' 'centre' 'center' 'central' 'cool' 'fresh' 'steady' 'stream' 'of' 'current' , description "The pool is full of water bubbling up from a submerged spring, which then pours out through the fissure in a steady stream.", after [; Receive: if(noun == black_powder) return self.receive_powder(); if(black_powder in noun && noun has open) { print (The) noun, " spills its contents into the water. "; return self.receive_powder(); } if(noun == rat or note or intelligence_report) { remove noun; print_ret (CTheIS) noun, " borne away on the current and disappears out of sight through the fissure."; } Examine: if(children(self)==0) rtrue; Search: if(children(self)==0) "There's nothing in the pool but the water bubbling up from below."; ], before [; Enter: "You don't have time for a bath right now."; Drink, Taste: if(parent(black_powder)==nothing) "Not after putting that powder in it!"; "You kneel down by the pool and cup your hands to draw out a couple of mouthfuls of water: it tastes cool and fresh."; Listen: "You can hear the water running out through the fissure. "; ], receive_powder [; remove black_powder; StartDaemon(black_powder); StartTimer(self, 5); achieve(poison_task); "The black powder quickly dissolves in the water, and is borne thence by the stream flowing out through the fissure. "; ], react_before [; Swim: "You don't have time for that; besides you don't have anything to dry yourself with and you don't want to be walking around wet on a chilly night."; Listen: if(noun==nothing) <>; ], time_left 0, time_out [; if(location == parent(self)) "It occurs to you that you may as well leave the cave now, if only to get a better view of the enemy camp."; ] has container open ; Fixture -> fissure3 "fissure" with name 'narrow' 'fissure' 'exit' 'mouth', description "Water pours out of the west end of the fissure, but the east end is reasonably dry, and looks large enough to crawl through.", before [; Enter: <>; ] ; Fixture -> cave_walls "walls" with name 'cave' 'rough' 'brown' 'rock' 'wall' 'walls' 'east' 'west' 'south', description "The walls of the cave are formed from unremarkable rough brown rock.", before [; SetPronoun('it', self); Touch: "The cave wall feels as rough as you would expect."; ] has pluralname ; Fixture -> cave_n_wall "north wall" with name 'north' 'n//' 'wall', description "In the north wall of the cave is the fissure through which the water is streaming out." ; Fixture -> cave_roof "roof of the cave" with pname '.x' 'cave' 'roof' '.or' 'ceiling' '.p' 'roof' 'of' 'the' 'cave', description "The roof of the cave is just above your head, forcing you to stoop. ", before [; Touch: "It's hard and rough: you certainly wouldn't want to bump your head against it."; ] ; Object water "water" with name 'water' 'colourless' 'colorless' 'liquid', description "It's a colourless liquid.", article "some", before [; Drink: self.implicit_open(); remove self; "You drink the water, and feel suitably refreshed. "; Pour, Transfer: switch(second) { pool: self.implicit_open(); remove self; "You pour the water back into the pool. "; default: "You see no reason to pour it there."; } Take: "Your might be able to pour it somewhere, but you can hardly take it."; ], implicit_open [ cont; cont = parent(self); if(cont ~= nothing && cont has openable && cont hasnt open) { give cont open; print "(first opening ", (the) cont, ")^"; } ], ; !=================================================== Object sword "sword" with name 'sharp' 'battered' 'sword' 'edge', description "It may be starting to look a little battered, but it has a sharp edge, and it has seen you through many a victorious battle. ", before [; Eat: "You're a soldier, not some charlatan sword-swallower in a country fair!"; Touch : "It has a good solid blade, rough to the touch, with a keen sharp edge you're careful not to cut yourself on."; ], ; Object breastplate "leather breastplate" with name 'old' 'scratched' 'leather' 'breastplate' 'armour' 'armor' 'plate', description "It's old and scratched, and hardly the most fashionable wear for a high-ranking general, but like your sword it's seen you through many a battle and it allows you so much more freedom of movement than some shiny steel thing. ", before [; Disrobe: "Time to do that when the battle's won; if it's lost you may as well be buried in it. "; Eat: "It's far too leathery to make an acceptable meal. Besides, it'll do your stomach more good protecting it from the outside. "; ], before_implicit [; Take: if(action_to_be==##Eat) return 2; ], has clothing ; Distant enemyCamp "enemy camp" with pname '.x' 'distant' '.x' 'barbarian' '.x' 'phartipu' '.x' 'enemy' 'camp' '.or' 'troops' '.or' 'horde' '.or' 'hordes' '.or' 'tents' '.or' 'warriors' '.p' '.x' 'camp' 'fires' '.p' 'flames' '.p' 'enemies', description "The distant enemy camp looks enormous; from the spread of camp fires and tents you estimate there must be over a hundred thousand barbarian troops out there ready to invade on the morrow. Even by moonlight you can pick out one tent in particular, almost a pavilion, set up just this side of the river. @01", before [; Enter: print_ret (string) ENEMY; Listen: "Occasional sounds drift up from the valley below: snatches of triumphant song, the occasional bugle-call or drum rattle, even what sounds likes taunts shouted against the army the enemy apparently still believe to be encamped up here on the ridge. @02"; ], react_before [; Listen:if(noun==nothing) { ; if(waterfall notin location) rtrue; } ], found_in [; return (location has view); ] ; Distant pavilion "pavilion" with pname '.x' 'great' 'pavilion' '.p' '.x' 'pong^s' 'command' '.or' 'largest' 'tent', description "The great pavilion, the largest tent in the valley, is presumably the command tent of the Great Pong, dread warlord and demigod of the Phartipu, Conqueror of a Thousand Lands, Scourge of the Weak, Hammer of the Strong, Pong the Widow-Maker, Pong the Virgin-Taker, Pong the Merciless, Pong the Immortal, Pong the Immoral, Pong the Tax-Evader and Doer of a Million Dastardly Deeds. It's no accident, you suppose, that his pavilion is pitched so close to the river, providing him with a ready water supply for all his needs. @01", found_in [; return (location has view); ] ; Distant valley "valley" with name 'valley' 'below', description "The valley below is filled with the tents and camp fires of the invading Phartipu, on both sides of the broad, moonlit river that cuts through its centre and forms the northern boundary of Lorayne. @01", before [; Enter: print_ret (string) ENEMY; ], found_in [; return (location has view); ] ; Distant river "river" with name 'distant' 'broad' 'moonlit' 'river' 'northern' 'boundary' 'hogwash' 'waters', description "The River Hogwash flows silently and sluggishly through the enemy camp in the valley below, its waters reflecting the silvery moonlight. ", found_in [; return (location has view); ] ; Distant moon "moon" with name 'bright' 'brilliant' 'full' 'moon' 'disk' 'disc' 'silvery' 'moonlight' 'ghostly' 'light', description "The moon is full tonight, a bright disc high in the sky casting a ghostly light over the landscape. ", found_in [; if(location has light) rtrue; ], has absent ; Distant sun "sun" with name 'reddening' 'sinking' 'dying' 'sun', description "The reddening sun is sinking rapidly towards the western horizon.", found_in dustyPath outside_hut lowerRidge, has ~absent ; Distant stars "stars" with name 'myriad' 'faint' 'stars' 'familiar' 'constellations', description "A myriad stars puncture the dome of the night sky, though they seem faint next to the brilliance of the new moon, making it hard to pick out any familiar constellations.", found_in [; if(location has light) rtrue; ], has absent pluralname ; Distant sky "sky" with name 'cloudless' 'black' 'dome' 'of' 'the' 'night' 'sky', description [; if(moon has absent) "The cloudless sky is reddening towards the west. "; else "The black night sky is full of stars, but they are far outshone by the brilliant full moon. "; ], found_in [; if(location has light) rtrue; ] ; Distant w_horizon "western horizon" with name 'distant' 'w//' 'west' 'western' 'horizon', description [; if(moon has absent) "The dying sun is rapidly approaching the western horizon. "; "It looks much like any other part of the night sky."; ], found_in [; if(location has light) rtrue; ] ; !====================================================== Object tasks ; ATask -> hut_task "points for opening the hut door" with value 2; ATask -> box_task "point for opening the strongbox"; ATask -> fire_task "points for setting fire to some enemy tents" with value 5; ATask -> bush_task "points for removing the bush" with value 2; ATask -> poison_task "points for poisoning the Phartipu's water supply" with value 5; !===================================================== [ Initialise; lookmode = 2; InitTasks(); string 01 ""; string 02 ""; location = dustyPath; #ifdef DEBUG; pname_verify(); #endif; move sword to player; move breastplate to player; give breastplate worn; player.description = "Tired, aching and battle-scarred, you are still Captain-General Yelanor, the best military commander in the land (though you say it yourself) and your country's last, best hope for victory. "; thedark.description = "There's not enough light to see by in here. "; Banner(); print "^Your horse went lame five miles back, so you had to leave him at some peasant's farm and continue the journey on foot. It would have been tempting to rest awhile, accepting the peasant's rustic hospitality, but the king's orders were explicit - make for Swineback Ridge with the minimum of delay. Weary though you are from battling against rebels in the east, the king insisted that he needs ", (i) "you", " here, to take command of the hopelessly outnumbered army up on the ridge ahead, an army that's your homeland's last, best hope to turn back the barbarian hordes and avoid the fall of night.^^For the tenth time today you wonder about the urgency. The last you heard General Chorza was in command of the army up on the ridge, and you know Chorza of old, a fine soldier and a good commander. So what is it that Chorza cannot handle himself?^^"; return 2; ]; [ PrintValOrRun obj prop; switch(metaclass(obj.prop)){ Object: return obj.prop; String: print_ret (string) obj.prop; Routine: return obj.prop(); default: rfalse; } ]; [that i; if(i has pluralname) print "those"; else print "that"; ]; [it i; if(i has pluralname) print "they"; else if(i has male) print "he"; else if(i has female) print "she"; else print "it"; ]; [itis i; print (it) i; if(i has pluralname) print " are"; else print " is"; ]; ![theIs i; ! print (the) i; ! if(i has pluralname) print " are"; ! else print " is"; !]; [CTheIs i; print (The) i; if(i has pluralname) print " are"; else print " is"; ]; [ ChooseObjects obj c; if(c < 2) { if(obj has scenery) return 2; rfalse; } if(action_to_be==##Unlock && obj==small_key) return 5; if(obj==hut or waterfall) return 3; if(obj==pool && action_to_be==##Drink or ##Taste) return 5; if(obj==water && action_to_be ~= ##Drink or ##Pour) return 0; if(obj==sky) return 2; if(obj ofclass Distant) return 1; if(obj hasnt scenery or static) return 3; return 2; ]; [ PourSub; print_ret "You can't pour ", (that) noun, " anywhere. "; ]; [ AboutSub; about_menu.select(); ]; [ FollowSub; print_ret "You can't follow ", (that) noun, "; ", (itis) noun, "n't going anywhere. "; ]; [ GoAlongSub; print_ret "You can't go along ", (ThatOrThose) noun, "."; ]; [ FireSub; print_ret "You can't fire ", (ThatOrThose) noun, "."; ]; [ ExitsSub; smartCantGo(true); ]; [ HintSub; hint_menu.select(); ]; [ XyzzySub; "In your long experience as a soldier, muttering strange incantations has never won a battle yet - and it doesn't this time, either. "; ]; [ KnockOnSub; "That achieves nothing."; ]; [ LookBehindSub; "You don't need to look behind anything in this game; EXAMINE or SEARCH should suffice."; ]; [ BadPraySub; "It would cause one hell of a stink if it came out that Lorayne's Captain General was praying to such a barbarous demon."; ]; [ AimSub; print_ret"You can't aim ", (that) noun, "."; ]; [ DouseSub; print_ret (CTheIs) noun, "n't alight."; ]; [ Max a b; if(a>b) return a; return b; ]; [is_fissure; return (noun==fissure or fissure2 or fissure3); ]; [ PutUnderSub; "There's no need to try putting anything under or behind things. "; ]; !========================================================================================= Menu about_menu "About" ; Option -> about_option "About this game" with description "~Swineback Ridge~ was written as a bit of fun, partly just to try writing something in Inform for a change, and partly to implement a game idea I'd had knocking around for some time. It's a short, puzzle-based game, hopefully not too difficult and certainly not very long. It's nothing very deep, but should provide a few minutes' amusement. As a relatively short, easy game it should be suitable both for beginners and for more experienced players looking for a little ~snack~ of an adventure.^^ ~Swineback Ridge~ is not a cruel game: there are no time limits, there's no way to get killed, and it should be impossible to get the game into an unwinnable state.^^ I've provided some in-game hints, but since this game rather loses its point if you don't work out the puzzles for yourself, they're more in the nature of nudges than solutions. Hints may be accessed directly using the commands HINT or HINTS." ; Option -> "Special Commands" with description "There are virtually no non-standard commands you actually need in order to win ~Swineback Ridge~. A few extra verbs are provided as alternative ways to phrase existing commands, and the grammar of some existing verbs (e.g. ~attack~) has been extended to allow the use of an indirect object. Some additional commands you may find useful include:^^ EXITS -- show a list of exits for the present location.^ HINT (or HINTS) -- show available hints.^ ABOUT (or HELP) -- show the About menu (but you must have worked that out already to be reading this text!).^" ; Option -> "Credits" with description "~Swineback Ridge~ uses a number of useful Inform library extensions:^^ Seeno.h by Cedric Knight (with one small change by myself to take advantage of a 6/11 feature).^ Scenic.h by Roger Firth and Stefano Gaburri (based on previous work by Richard Barnet and Jo Mason).^ Pname.h by Neil Ceruti.^ Style.h by Chris Klimas.^^ The menu system (NewMenus.h) is based on Menus.h by Graham Nelson, but has been heavily reworked by me (a) to make it Glulx-compatible, (b) to take advantage of features new to the 6/11 library and (c) to incorporate a hint system of my own devising (which borrows several ideas from Mike Roberts's adv3 library for TADS 3).^^ The beta-testers for ~Swineback Ridge~ were Johan Berntsson, Sara Brookside, Samantha Casanova, Katzy (aka Javri), Michel Nizette, George Oliver, and Phil Swinbank - a superb team who between them managed to unearth far more things that needed improving in this tiny game than I ever dreamt possible!^^ Last, but by no means least, the Inform language and library are by Graham Nelson.^^" ; Option -> "Feedback and Bugs" with description "If you have any comments on the game, or find any bugs you feel like reporting, I'll always be glad to hear from you. You can email me on eric.eve@@64hmc.ox.ac.uk." ; Option -> "License" with description "~Swineback Ridge~ is Freeware.^^ 1. This license grants you the right to use and distribute ~Swineback Ridge~ under the conditions outlined below. You cannot use or distribute the game if you do not agree with these conditions.^^ 2. The game, including any and all associated files as well as all of the output produced by the game, and all derivative works, is copyright (c) 2006 Eric Eve.^^ 3. Queries about the license should be addressed to the copyright holder, whose address at the time of writing is eric.eve@@64hmc.ox.ac.uk. If contact cannot be established, you may be able to locate the copyright holder via the rec.arts.int-fiction Internet newsgroup.^^ 4. You are allowed to use the game and make copies for your personal use without restrictions. You may also copy and distribute the game in any medium, as long as (a) you make no charge for doing so, beyond a nominal charge to cover the costs of media and distribution, and (b) the game, all associated files and this license are included and remain unmodified.^^ 5. You are not allowed to make a charge for distributing the game (other than merely to recover your media and distribution costs) whether as a stand-alone product, or as part of a compilation or anthology, without written permission.^^ 6. NO WARRANTY. The game is licensed and provided ~as is~ without warranty of any kind, express or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose or a warranty of non-infringement." ; Menu -> hint_menu "Hints" ; HintGoal ->-> start_goal "What do I do now?" has open with when_closed [; return (outside_hut has visited && inside_tent has visited && inside_supply_tent has visited); ], description "Try Exploring. " "Then explore some more. " "After that, carry on exploring. " ; HintGoal ->-> next_goal "Now what do I do?" with when_open [; return (start_goal hasnt open); ], description "Obviously, you need to find a way to defeat the Phartipu." "Equally obviously, you can't kill them all single-handed." "So you'll have to try some other way to get rid of them." "What might rout any army apart from actual defeat on the battlefield?" "Perhaps you could destroy their morale?" "How closely have you looked at the valley and the enemy camp?" "Have you read the latest intelligence report?" "How would the Phartipu react if something dire happened to the Great Pong?" "Where is the Great Pong's pavilion placed?" "Why does it seem to be placed there?" "Could you do something to his water supply?" ; HintGoal ->-> "How do I get into the hut?" with when_open [; return (outside_hut has visited); ], when_closed [; return (inside_hut has visited); ], description "You'll have to find some way of unlocking the door." "It may not be entirely conventional." "What, besides a key, could you try putting in the lock?" ; HintGoal ->-> "How can I get past the prickly bush?" with when_open [; return (bush has visited); ], when_closed [; return (parent(bush) == nothing); ], description "It seems too thick to get through." "So what might you do to a bush that's too thick?" "What could you cut it with?" "Have you tried feeling it?" "What happens when you cut it with your sword?" "It that didn't work immediately, perhaps the response contained a clue?" "Golly ...!" "What kind of bush do you associate with Moses?" "Unfortunately Moses' bush wasn't consumed, and this one may need some encouragement." ; HintGoal ->-> "How can I get past the patrols?" with when_open [; return (steep_path has locked); ], when_closed [; return (steep_path.patrolled == false); ], description "Perhaps getting past them isn't quite what you need to do." "Maybe you should think in terms of distraction instead." "What might cause a disturbance in the enemy camp?" "Have you tried using the ballista?" ; HintGoal ->-> "How do I work the ballista?" with when_open [; return ballista_lever.result == 1; ], when_closed [; return ballista_lever.result > 1; ], description "How closely have you examined it?" "It's like a giant crossbow - what steps would you expect to take?" "What do suppose the handle's for?" "What sort of object would you expect to load the ballista with?" "Where have you seen something like that quite close by?" ; HintGoal ->-> "Can I make the ballista do something more effective?" with when_open [; return ballista_lever.result == 2; ], when_closed [; return ballista_lever.result > 2; ], description "Yes." "What might make a ballista bolt do more damage?" "Have you seen anything with a flame round here?" "Have you come across anything else that might be described as ~fiery~?" ; HintGoal ->-> "How can I climb up into the fissure?" with when_open [; return below_fissure has locked; ], when_closed [; return inside_cave has visited; ], description "What happens when you try?" "Is anything mentioned that might be useful?" "If you can't use the round hole as a handhold, what else might you use it for?" "What might support your efforts to climb?" "How might you wedge something in the hole?" ; #Ifdef DEBUG; [ LanguageVerbIsDebugging w; if (w == 'purloin' or 'tree' or 'abstract' or 'pn' or 'gn' or 'gonear' or 'scope' or 'showobj') rtrue; rfalse; ]; #Endif; !===================================================== Constant ScenicError myScenicError; Global ScenicFlag = 7; Include "Scenic"; [myScenicError; switch(action_to_be){ ##Smell, ##Drink: L__M(action_to_be); ##Fill, ##Insert, ##Open, ##Close, ##PutOn, ##Take: print_ret "You neither can nor need to manipulate the ", (address) ScenicFound, "."; ##GetOff: print_ret "You aren't on the ", (address) ScenicFound, "."; ##Exit: print_ret "You aren't in the ", (address) ScenicFound, "."; default: print_ret "You may as well leave the ", (address) ScenicFound, " alone."; } ]; Include "Grammar"; Verb 'pour' * noun 'in'/'into'/'on'/'onto' noun -> Pour ; ifdef DEBUG; Verb meta 'pn' * multi ->XPurloin; Verb meta 'gn' * noun -> GoNear; endif; Verb meta 'about' 'help' * -> About; Verb 'exits' * -> Exits; Verb 'kick' = 'attack'; Verb 'follow' * noun ->Follow; Verb 'wind' 'crank' = 'turn'; Verb 'load' * container 'with' held ->Insert reverse * noun 'into'/'onto' container ->Insert ; Verb 'fire' * noun -> Fire; Verb 'wedge' * held 'in' noun ->Insert; Verb 'crawl' * 'through'/'into'/'in' noun=is_fissure ->Enter; Verb 'grab' = 'take'; Verb meta 'hint' 'hints' * ->Hint; Verb 'xyzzy' 'plugh' 'plover' * ->Xyzzy; Verb 'knock' * noun -> KnockOn * 'on' noun -> KnockOn ; Verb 'aim' * noun -> Aim; Verb 'extinguish' 'douse' * noun -> Douse; Verb 'hack' = 'cut'; Extend 'take' * noun = is_dagger 'from' noun=is_corpse -> Remove * noun 'with' noun ->Insert ; Extend 'remove' * noun = is_dagger 'from' noun=is_corpse -> Remove ; Extend 'pull' * noun = is_dagger 'from' noun=is_corpse -> Remove ; Extend 'pray' * 'to' 'malodor' ->BadPray; Extend 'go' * 'along'/'up'/'down' noun -> GoAlong ; Extend 'cut' * 'through' noun 'with' held -> Cut * noun 'with' held -> Cut ; Extend 'drink' * 'from' noun -> Drink; Extend only 'climb' * 'in'/'into'/'on'/'onto' noun -> Enter; Extend 'attack' * noun 'with' held ->Attack; Extend only 'squeeze' * 'through' noun=is_fissure ->Enter; Extend 'burn' first * flammable 'with' held ->Burn; Extend 'look' * 'around' -> Look * 'behind' noun ->LookBehind * noun -> Examine; Extend 'examine' * noun=ADirection -> Examine * 'to' noun=ADirection -> Examine ; Extend 'fill' * noun 'with' noun -> Insert reverse; Extend only 'pick' * noun ->Take * noun 'with' held ->Unlock ; Extend 'put' * multiexcept 'under'/'behind' noun ->PutUnder;